home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Environments / PowerMacOberon feb96 / Source / Draw.Mod (.txt) < prev    next >
Encoding:
Oberon Text  |  1994-07-11  |  8.9 KB  |  252 lines  |  [.Ob./.Ob4]

  1. Syntax10.Scn.Fnt
  2. MODULE Draw; (*NW 29.6.88 / 22.11.91*)
  3.     IMPORT Files, Fonts, Viewers, Printer, Texts, Oberon,
  4.         TextFrames, MenuViewers, Graphics, GraphicFrames;
  5.     VAR W: Texts.Writer;
  6.     (*Exported commands:
  7.         Open, Delete,
  8.         SetWidth, ChangeColor, ChangeWidth, ChangeFont,
  9.         Store, Print
  10.         Macro, OpenMacro, MakeMacro, StoreLibrary*)
  11.     PROCEDURE Open*;
  12.         VAR X, Y: INTEGER;
  13.             beg, end, t: LONGINT;
  14.             G: Graphics.Graph;
  15.             F: GraphicFrames.Frame;
  16.             V: Viewers.Viewer;
  17.             text: Texts.Text;
  18.             S: Texts.Scanner;
  19.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  20.         IF (S.class = Texts.Char) & (S.c = "^") THEN
  21.             Oberon.GetSelection(text, beg, end, t);
  22.             IF t >= 0 THEN Texts.OpenScanner(S, text, beg); Texts.Scan(S) END
  23.         END ;
  24.         IF S.class = Texts.Name THEN
  25.             NEW(G); Graphics.Open(G, S.s);
  26.             NEW(F); GraphicFrames.Open(F, G, -1, 0, 0, TRUE);
  27.             Oberon.AllocateUserViewer(Oberon.Par.vwr.X, X, Y);
  28.             V := MenuViewers.New(
  29.                 TextFrames.NewMenu(S.s, "System.Close  System.Copy  System.Grow  Draw.Delete  Draw.Store"),
  30.                 F, TextFrames.menuH, X, Y)
  31.         END
  32.     END Open;
  33.     PROCEDURE Delete*;
  34.         VAR F: GraphicFrames.Frame;
  35.     BEGIN
  36.         IF Oberon.Par.frame = Oberon.Par.vwr.dsc THEN
  37.             F := Oberon.Par.vwr.dsc.next(GraphicFrames.Frame);
  38.             GraphicFrames.Erase(F); Graphics.Delete(F.graph)
  39.         END
  40.     END Delete;
  41.     PROCEDURE SetWidth*;
  42.         VAR S: Texts.Scanner;
  43.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  44.         IF (S.class = Texts.Int) & (S.i > 0) & (S.i < 7) THEN Graphics.width := SHORT(S.i) END
  45.     END SetWidth;
  46.     PROCEDURE ChangeColor*;
  47.         VAR ch: CHAR;
  48.             CM: Graphics.ColorMsg;
  49.             S: Texts.Scanner;
  50.     BEGIN
  51.         IF Oberon.Par.frame(TextFrames.Frame).hasSel THEN
  52.             Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.frame(TextFrames.Frame).selbeg.pos);
  53.             Texts.Read(S, ch); CM.col := S.col
  54.         ELSE Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  55.             IF S.class = Texts.Int THEN CM.col := SHORT(S.i) ELSE CM.col := S.col END
  56.         END ;
  57.         GraphicFrames.Change(GraphicFrames.Selected(), CM)
  58.     END ChangeColor;
  59.     PROCEDURE ChangeWidth*;
  60.         VAR WM: Graphics.WidMsg;
  61.             S: Texts.Scanner;
  62.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  63.         IF S.class = Texts.Int THEN
  64.             WM.w := SHORT(S.i); GraphicFrames.Change(GraphicFrames.Selected(), WM)
  65.         END
  66.     END ChangeWidth;
  67.     PROCEDURE ChangeFont*;
  68.         VAR FM: Graphics.FontMsg;
  69.             S: Texts.Scanner;
  70.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  71.         IF S.class = Texts.Name THEN
  72.             FM.fnt := Fonts.This(S.s);
  73.             IF FM.fnt # NIL THEN GraphicFrames.Change(GraphicFrames.Selected(), FM) END
  74.         END
  75.     END ChangeFont;
  76.     PROCEDURE Backup (VAR name: ARRAY OF CHAR);
  77.         VAR res, i: INTEGER; ch: CHAR;
  78.             bak: ARRAY 32 OF CHAR;
  79.     BEGIN i := 0; ch := name[0];
  80.         WHILE ch > 0X DO bak[i] := ch; INC(i); ch := name[i] END ;
  81.         IF i < 28 THEN
  82.             bak[i] := "."; bak[i+1] := "B"; bak[i+2] := "a"; bak[i+3] := "k"; bak[i+4] := 0X;
  83.             Files.Rename(name, bak, res)
  84.         END
  85.     END Backup;
  86.     PROCEDURE Store*;
  87.         VAR par: Oberon.ParList; S: Texts.Scanner;
  88.             Menu: TextFrames.Frame; G: GraphicFrames.Frame;
  89.             v: Viewers.Viewer;
  90.     BEGIN par := Oberon.Par;
  91.         IF par.frame = par.vwr. dsc THEN
  92.             Menu := par.vwr.dsc(TextFrames.Frame); G := Menu.next(GraphicFrames.Frame);
  93.             Texts.OpenScanner(S, Menu.text, 0); Texts.Scan(S);
  94.             IF S.class = Texts.Name THEN
  95.                 Texts.WriteString(W, S.s); Texts.WriteString(W, " storing");
  96.                 Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
  97.                 Backup(S.s); Graphics.WriteFile(G.graph, S.s)
  98.             END
  99.         ELSE
  100.             Texts.OpenScanner(S, par.text, par.pos); Texts.Scan(S);
  101.             IF S.class = Texts.Name THEN
  102.                 v := Oberon.MarkedViewer();
  103.                 IF (v.dsc # NIL) & (v.dsc.next IS GraphicFrames.Frame) THEN
  104.                     G := v.dsc.next(GraphicFrames.Frame);
  105.                     Texts.WriteString(W, S.s); Texts.WriteString(W, " storing");
  106.                     Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
  107.                     Backup(S.s); Graphics.WriteFile(G.graph, S.s)
  108.                 END
  109.             END
  110.         END
  111.     END Store;
  112.     PROCEDURE Print*;
  113.         VAR nofcopies: INTEGER;
  114.             S: Texts.Scanner;
  115.             G: Graphics.Graph;
  116.             V: Viewers.Viewer;
  117.         PROCEDURE Copies;
  118.             VAR ch: CHAR;
  119.         BEGIN nofcopies := 1;
  120.             IF S.nextCh = "/" THEN
  121.                 Texts.Read(S, ch);
  122.                 IF (ch >= "0") & (ch <= "9") THEN nofcopies := ORD(ch) - 30H END ;
  123.                 WHILE ch > " " DO Texts.Read(S, ch) END ;
  124.                 S.nextCh := ch
  125.             END
  126.         END Copies;
  127.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  128.         IF S.class = Texts.Name THEN
  129.             Printer.Open(S.s, Oberon.User, Oberon.Password);
  130.             IF Printer.res = 0 THEN
  131.                 Texts.Scan(S);
  132.                 WHILE S.class = Texts.Name DO
  133.                     Texts.WriteString(W, S.s); Copies; NEW(G); Graphics.Open(G, S.s);
  134.                     IF Graphics.res = 0 THEN
  135.                         Texts.WriteString(W, " printing");
  136.                         Texts.WriteInt(W, nofcopies, 3); Texts.Append(Oberon.Log, W.buf);
  137.                         Graphics.Print(G, 0, Printer.PageHeight-128); Printer.Page(nofcopies)
  138.                     ELSE Texts.WriteString(W, " not found")
  139.                     END ;
  140.                     Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); Texts.Scan(S)
  141.                 END ;
  142.                 IF (S.class = Texts.Char) & (S.c = "*") THEN
  143.                     Copies; V := Oberon.MarkedViewer();
  144.                     IF (V.dsc # NIL) & (V.dsc.next IS GraphicFrames.Frame) THEN
  145.                         Texts.OpenScanner(S, V.dsc(TextFrames.Frame).text, 0);
  146.                         Texts.Scan(S);
  147.                         IF S.class = Texts.Name THEN
  148.                             Texts.WriteString(W, S.s); Texts.WriteString(W, " printing");
  149.                             Texts.WriteInt(W, nofcopies, 3); Texts.Append(Oberon.Log, W.buf);
  150.                             Graphics.Print(V.dsc.next(GraphicFrames.Frame).graph, 0, Printer.PageHeight-128);
  151.                             Printer.Page(nofcopies)
  152.                         END
  153.                     END
  154.                 END ;
  155.                 Printer.Close
  156.             ELSIF Printer.res = 1 THEN Texts.WriteString(W, " no printer")
  157.             ELSIF Printer.res = 2 THEN Texts.WriteString(W, " no link")
  158.             ELSIF Printer.res = 3 THEN Texts.WriteString(W, " bad response")
  159.             ELSIF Printer.res = 4 THEN Texts.WriteString(W, " no permission")
  160.             END
  161.         END ;
  162.         Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
  163.     END Print;
  164.     PROCEDURE Macro*;
  165.         VAR S: Texts.Scanner;
  166.             T: Texts.Text;
  167.             time, beg, end: LONGINT;
  168.             Lname: ARRAY 32 OF CHAR;
  169.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  170.         IF S.class = Texts.Name THEN
  171.             COPY(S.s, Lname); Texts.Scan(S);
  172.             IF (S.class = Texts.Char) & (S.c = "^") THEN
  173.                 Oberon.GetSelection(T, beg, end, time);
  174.                 IF time >= 0 THEN Texts.OpenScanner(S, T, beg); Texts.Scan(S) END
  175.             END ;
  176.             IF (S.class = Texts.Name) OR (S.class = Texts.String) THEN
  177.                 GraphicFrames.Macro(Lname, S.s)
  178.             END
  179.         END
  180.     END Macro;
  181.     PROCEDURE OpenMacro*;
  182.         VAR F: GraphicFrames.Frame; sel: Graphics.Object;
  183.     BEGIN F := GraphicFrames.Selected();
  184.         IF F # NIL THEN
  185.             sel := F.graph.sel;
  186.             IF (sel # NIL) & (sel IS Graphics.Macro) THEN
  187.                 GraphicFrames.Deselect(F);
  188.                 Graphics.OpenMac(sel(Graphics.Macro).mac, F.graph, F.mark.x - F.x, F.mark.y - F.y);
  189.                 GraphicFrames.Draw(F)
  190.             END
  191.         END
  192.     END OpenMacro;
  193.     PROCEDURE MakeMacro*;
  194.         VAR new: BOOLEAN;
  195.             F: GraphicFrames.Frame;
  196.             S: Texts.Scanner;
  197.             Lname: ARRAY 32 OF CHAR;
  198.         PROCEDURE MakeMac;
  199.             VAR x0, y0, x1, y1, w, h: INTEGER;
  200.                 mh: Graphics.MacHead;
  201.                 L: Graphics.Library;
  202.         BEGIN
  203.             L := Graphics.ThisLib(Lname, FALSE);
  204.             IF L = NIL THEN L := Graphics.NewLib(Lname) END ;
  205.             x0 := F.mark.x; y0 := F.mark.y; x1 := F.mark.next.x; y1 := F.mark.next.y;
  206.             w := ABS(x1-x0); h := ABS(y1-y0);
  207.             IF x0 < x1 THEN x0 := x0 - F.x ELSE x0 := x1 - F.x END ;
  208.             IF y0 < y1 THEN y0 := y0 - F.y ELSE y0 := y1 - F.y END ;
  209.             mh := Graphics.MakeMac(F.graph, x0, y0, w, h, S.s);
  210.             Graphics.InsertMac(mh, L, new)
  211.         END MakeMac;
  212.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  213.         IF S.class = Texts.Name THEN
  214.             COPY(S.s, Lname); Texts.Scan(S);
  215.             IF (S.class  = Texts.Name) OR (S.class = Texts.String) & (S.len <= 8) THEN
  216.                 F := GraphicFrames.Focus();
  217.                 IF (F # NIL) & (F.graph.sel # NIL) THEN
  218.                     MakeMac; Texts.WriteString(W, S.s);
  219.                     IF new THEN Texts.WriteString(W, " inserted in ")
  220.                     ELSE Texts.WriteString(W, " replaced in ")
  221.                     END ;
  222.                     Texts.WriteString(W, Lname); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
  223.                 END
  224.             END
  225.         END
  226.     END MakeMacro;
  227.     PROCEDURE LoadLibrary*;
  228.         VAR S: Texts.Scanner; L: Graphics.Library;
  229.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  230.         IF S.class = Texts.Name THEN
  231.             L := Graphics.ThisLib(S.s, TRUE);
  232.             Texts.WriteString(W, S.s); Texts.WriteString(W, " loaded");
  233.             Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
  234.         END
  235.     END LoadLibrary;
  236.     PROCEDURE StoreLibrary*;
  237.         VAR i: INTEGER; S: Texts.Scanner; L: Graphics.Library;
  238.             Lname: ARRAY 32 OF CHAR;
  239.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  240.         IF S.class = Texts.Name THEN i := 0;
  241.             WHILE S.s[i] >= "0" DO Lname[i] := S.s[i]; INC(i) END ;
  242.             Lname[i] := 0X; 
  243.             L := Graphics.ThisLib(Lname, FALSE);
  244.             IF L # NIL THEN
  245.                 Texts.WriteString(W, S.s); Texts.WriteString(W, " storing");
  246.                 Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); Graphics.StoreLib(L, S.s)
  247.             END
  248.         END
  249.     END StoreLibrary;
  250. BEGIN Texts.OpenWriter(W)
  251. END Draw.
  252.